package com.xxxtea.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.xxxtea.common.BaseEnum;
import com.xxxtea.config.converter.BaseEnumDeserializer;
import com.xxxtea.mpe.annotation.Constraint;
import com.xxxtea.mpe.annotation.ExtendQuery;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;

import java.util.Date;

/**
 * 任务操作记录实体类
 *
 * 用于存储任务的各种操作记录，包括：
 * - 操作基本信息（操作类型、备注、时间等）
 * - 操作用户关联
 * - 任务关联
 * - 操作审计追踪
 *
 * 使用MyBatis-Plus注解进行数据库映射
 * 使用Swagger注解进行API文档生成
 *
 * @author badman
 * @since 1.0.0
 */
@Data
@ApiModel("任务操作记录")
@TableName(autoResultMap = true)
public class TaskOperation {

	/**
	 * 主键ID
	 * 使用自增策略
	 */
	@ApiModelProperty("主键")
	@TableId(value = "id", type = IdType.AUTO)
	private Integer id;

	/**
	 * 任务ID
	 * 关联Task表
	 */
	@ApiModelProperty("任务ID")
	@Constraint(referenceClass = Task.class)
	private Integer taskId;

	/**
	 * 操作用户ID
	 * 自动填充当前用户ID
	 */
	@ApiModelProperty("操作用户ID")
	@TableField(fill = FieldFill.INSERT)
	private Integer userId;

	/**
	 * 操作类型
	 * 1-接单 2-取消 3-开始执行 4-更新进度 5-确认完成 6-申请取消
	 * 使用枚举类型管理
	 */
	@ApiModelProperty("操作类型 1-接单 2-取消 3-开始执行 4-更新进度 5-确认完成 6-申请取消")
	@JsonDeserialize(using = BaseEnumDeserializer.class)
	private OperationType operationType;

	/**
	 * 操作备注
	 * 操作的详细说明
	 */
	@ApiModelProperty("操作备注")
	private String remark;

	/**
	 * 操作时间
	 * 自动填充插入时间
	 */
	@ApiModelProperty("操作时间")
	@TableField(fill = FieldFill.INSERT)
	private Date createTime;

	/**
	 * 任务名称
	 * 非数据库字段，扩展查询字段，关联任务表获取任务名称
	 */
	@TableField(exist = false)
	@ExtendQuery(referenceClass = Task.class, targetColumn = "name")
	private String taskName;

	/**
	 * 操作类型枚举
	 * 定义任务的各种操作类型
	 */
	@Getter
	@AllArgsConstructor
	public enum OperationType implements BaseEnum<OperationType> {
		/**
		 * 接单操作
		 */
		OperationType1(1, "接单"),
		/**
		 * 取消操作
		 */
		OperationType2(2, "取消"),
		/**
		 * 开始执行操作
		 */
		OperationType3(3, "开始执行"),
		/**
		 * 更新进度操作
		 */
		OperationType4(4, "更新进度"),
		/**
		 * 确认完成操作
		 */
		OperationType5(5, "确认完成"),
		/**
		 * 申请取消操作
		 */
		OperationType6(6, "申请取消"),
		;
		private final Integer value;
		private final String label;
	}
}